/**
 * @file collection.h
 * @brief Fichier d'entête du module collection.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

#ifndef H_COLLECTION_H
#define H_COLLECTION_H

/* *********************************************************************

                       Librairies de collection                           

********************************************************************* */

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include "utilitaireString.h"

/* *********************************************************************

                        Définitions de types                           

********************************************************************* */

/**
 * @struct sCollection
 * @brief Structure utilisée pour la gestion des Collection
 *
 * Cette structure est utilisée pour gérer un Collection. Les champs de cette structure doivent être modifiés ou lus par les accesseurs et mutateurs. Ils doivent être initialisés et libérés avec les fonctions prévus à cette effet
 */
struct sCollection {
  unsigned int id; /** */
  char * libelle; /** */
  int nbLivre; /** Nombre de livre de la collection */
  char maj;
  char sup;
};
/**
 * @typedef Collection
 * @brief Redéfinit la structure sCollection
 */
  typedef struct sCollection Collection;

/* *********************************************************************

           Fonctions de la structure Collection          

********************************************************************* */

/**
 * @fn Collection * creer_Col() ;
 * @brief Crée une collection dans le tas
 *
 * @return un pointeur sur Collection
 */
Collection * creer_Col();

/**
 * @fn void init_Col(Collection * collection);
 * @brief Initilise une collection
 *
 * @param[in,out] Collection pointeur sur Collection
 */
void init_Col(Collection * collection);

/**
 * @fn void liberer_Col(Collection * collection);
 * @brief Libère la collection
 *
 * @param[in,out] collection pointeur sur Collection
 */
void liberer_Col(Collection * collection);

/**
 * @fn void detruire_Col(Collection ** collection);
 * @brief Détruis une collection du tas
 * 
 * @param[in,out] collection pointeur sur Collection
 */
void detruire_Col(Collection ** collection);

/**
 * @fn void copier_Col(Collection *dest, const Collection *src);
 * @brief Copie dans dest le Collection src
 *
 * @param[in,out] dest contiendra les mêmes infor que src
 * @param src
 */
void copier_Col(Collection **dest, const Collection *src);

/* *********************************************************************

           Accesseurs et Mutateurs de la structure Collection               

********************************************************************* */

/**
 * @fn unsigned int getId_Col(const Collection * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Collection
 * @return unsigned int
 */
unsigned int getId_Col(const Collection * ptr) ;

/**
 * @fn void setId_Col(Collection *ptr, const unsigned int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Collection.
 * @param val.
 */
void setId_Col(Collection *ptr, const unsigned int val) ;

/**
 * @fn char * getLibelle_Col(const Collection * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Collection
 * @return char *
 */
char * getLibelle_Col(const Collection * ptr) ;

/**
 * @fn void setLibelle_Col(Collection *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Collection.
 * @param val.
 */
void setLibelle_Col(Collection *ptr, const char * val) ;

/**
 * @fn int getNbLivre_Col(const Collection * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Collection
 * @return char *
 */
int getNbLivre_Col(const Collection * ptr) ;

/**
 * @fn void setNbLivre_Col(Collection *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Collection.
 * @param val.
 */
void setNbLivre_Col(Collection *ptr, const int val) ;

/**
 * @fn void setMaj_Col(Collection *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Col(Collection *ptr, const char b);

/**
 * @fn char getMaj_Col(const Collection *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Col(const Collection *ptr);

/**
 * @fn void setSup_Col(Collection *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Col(Collection *ptr, const char b);

/**
 * @fn char getSup_Col(const Collection *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Col(const Collection *ptr);

#endif
